昨天我們介紹了資料類別,今天則是要談談密封
密封類別以及介面代表著受到繼承限制
宣告的方式如下,在個別的名稱前面加上sealed
sealed interface Error
sealed class IOError(): Error
class FileReadError(val file: File): IOError()
class DatabaseError(val source: DataSource): IOError()
object RuntimeError : Error
需要注意的是密封類別(sealed class)它本身是抽象的,因此無法被實例化
密封類別的建構子可以是protected(預設)或是private
sealed class IOError {
constructor() { /*...*/ }
private constructor(description: String): this() { /*...*/ }
}
當使用when表示式時,密封類別的優勢就在於已包含所有的case,因此不需要另外的else
這部分可以參考以下範例:
fun log(e: Error) = when(e) {
is FileReadError -> { println("Error while reading file ${e.file}") }
is DatabaseError -> { println("Error while reading from database ${e.source}") }
is RuntimeError -> { println("Runtime error") }
}